}
}
+static gboolean
+has_events_already (GdkDisplay *display)
+{
+ gboolean r = XEventsQueued (GDK_DISPLAY_XDISPLAY (display), QueuedAlready);
+ return r;
+}
+
static gboolean
gdk_event_prepare (GSource *source,
gint *timeout)
*timeout = -1;
retval = (_gdk_event_queue_find_first (display) != NULL ||
- gdk_check_xpending (display));
+ has_events_already (display));
GDK_THREADS_LEAVE ();
GDK_THREADS_ENTER ();
_gdk_events_queue (display);
+
event = _gdk_event_unqueue (display);
if (event)
{
if (_gdk_event_func)
(*_gdk_event_func) (event, _gdk_event_data);
-
gdk_event_free (event);
- }
+ }
GDK_THREADS_LEAVE ();
return focus_window;
}
+static void
+ensure_sync_counter (GdkWindow *window)
+{
+#ifdef HAVE_XSYNC
+ if (!GDK_WINDOW_DESTROYED (window))
+ {
+ GdkDisplay *display = GDK_WINDOW_DISPLAY (window);
+ GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (window);
+ GdkWindowObject *private = (GdkWindowObject *)window;
+ GdkWindowImplX11 *impl = GDK_WINDOW_IMPL_X11 (private->impl);
+
+ if (toplevel && impl->use_synchronized_configure &&
+ toplevel->update_counter == None &&
+ GDK_DISPLAY_X11 (display)->use_sync)
+ {
+ Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);
+ XSyncValue value;
+ Atom atom;
+
+ XSyncIntToValue (&value, 0);
+
+ toplevel->update_counter = XSyncCreateCounter (xdisplay, value);
+
+ atom = gdk_x11_get_xatom_by_name_for_display (display,
+ "_NET_WM_SYNC_REQUEST_COUNTER");
+
+ XChangeProperty (xdisplay, GDK_WINDOW_XID (window),
+ atom, XA_CARDINAL,
+ 32, PropModeReplace,
+ (guchar *)&toplevel->update_counter, 1);
+
+ XSyncIntToValue (&toplevel->current_counter_value, 0);
+ }
+ }
+#endif
+}
+
static void
setup_toplevel_window (GdkWindow *window,
GdkWindow *parent)
gdk_x11_window_set_user_time (window, 0);
else if (GDK_DISPLAY_X11 (screen_x11->display)->user_time != 0)
gdk_x11_window_set_user_time (window, GDK_DISPLAY_X11 (screen_x11->display)->user_time);
+
+ ensure_sync_counter (window);
}
/**
void
gdk_window_enable_synchronized_configure (GdkWindow *window)
{
+ GdkWindowObject *private = (GdkWindowObject *)window;
+ GdkWindowImplX11 *impl;
+
g_return_if_fail (GDK_IS_WINDOW (window));
-
-#ifdef HAVE_XSYNC
- if (!GDK_WINDOW_DESTROYED (window))
- {
- GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (window);
- GdkDisplay *display = GDK_WINDOW_DISPLAY (window);
- if (toplevel && toplevel->update_counter == None &&
- GDK_DISPLAY_X11 (display)->use_sync)
- {
- Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);
- XSyncValue value;
- Atom atom;
-
- if (toplevel->update_counter != None)
- return;
-
- XSyncIntToValue (&value, 0);
-
- toplevel->update_counter = XSyncCreateCounter (xdisplay, value);
-
- atom = gdk_x11_get_xatom_by_name_for_display (display,
- "_NET_WM_SYNC_REQUEST_COUNTER");
-
- XChangeProperty (xdisplay, GDK_WINDOW_XID (window),
- atom, XA_CARDINAL,
- 32, PropModeReplace,
- (guchar *)&toplevel->update_counter, 1);
+ impl = GDK_WINDOW_IMPL_X11 (private->impl);
- XSyncIntToValue (&toplevel->current_counter_value, 0);
- }
+ if (!impl->use_synchronized_configure)
+ {
+ impl->use_synchronized_configure = TRUE;
+ ensure_sync_counter (window);
}
-#endif /* HAVE_XSYNC */
}
/**
gdk_window_configure_finished (GdkWindow *window)
{
g_return_if_fail (GDK_IS_WINDOW (window));
-
+
#ifdef HAVE_XSYNC
if (!GDK_WINDOW_DESTROYED (window))
{